package com.powernode.controller;

import com.powernode.constant.Constants;
import com.powernode.entity.Goods;
import com.powernode.entity.Orders;
import com.powernode.entity.Users;
import com.powernode.service.GoodsService;
import com.powernode.service.OrderService;
import com.powernode.vo.HttpResult;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import java.util.List;

/**
 * 商品控制器，负责处理商品相关的HTTP请求
 * 包括商品列表查询、详情展示、秒杀时间验证和订单结果查询等功能
 */
@Tag(name="商品接口")
@Controller
@RequestMapping("/goods")
public class GoodsController {

    @Resource
    private GoodsService goodsService;  // 商品服务层依赖注入

    @Resource
    private OrderService orderService;  // 订单服务层依赖注入

    /**
     * 查询商品列表
     * 1. 调用goodsService查询商品信息
     * 2. 将商品数据传递给前端视图
     * 3. 指定跳转至商品列表页面
     * @return 包含商品列表数据的ModelAndView对象
     */
    @GetMapping("/list")
    public ModelAndView queryGoodsList() {
        ModelAndView mv = new ModelAndView("list");// 指定跳转的页面名称为list.html

        // 查询商品信息
        List<Goods> goods = goodsService.queryGoodsList();

        // 将商品数据返回给前端,goodsList要与前端Thymeleaf模板中的变量名对应
        mv.addObject("goodsList", goods);

        return mv;
    }

    /**
     * 根据ID查询商品详情
     * @param id 商品ID路径参数
     * @return 包含商品详情数据的ModelAndView对象
     */
    @GetMapping("/{id}")
    public ModelAndView queryGoodsById(@PathVariable("id") Integer id) {
        ModelAndView mv = new ModelAndView("detail");// 指定跳转的页面名称为detail.html

        // 查询商品详情信息
        Goods goods = goodsService.queryGoodsById(id);
        mv.addObject("goods", goods);
        mv.addObject("nowTime", System.currentTimeMillis());// 传递当前时间戳用于前端倒计时

        return mv;
    }

    /**
     * 查询秒杀随机码接口
     * 验证秒杀时间是否有效，并返回随机码用于后续秒杀请求
     * @param request HTTP请求对象，用于存储用户会话信息
     * @param id 商品ID路径参数
     * @return 包含随机码的HttpResult对象
     */
    @Operation(summary = "查询随机码")
    @GetMapping("/time/{id}")
    @ResponseBody  // 将返回值以JSON格式返回给前端
    public HttpResult goodsTime(HttpServletRequest request, @PathVariable("id") Integer id) {
        // 构建模拟用户信息（实际项目中应从登录状态获取）
        Users user = Users.builder().id(1001).name("刘亦菲").phone("13888888888").build();

        // 将用户信息放入session，模拟用户登录状态
        request.getSession().setAttribute(Constants.LOGIN_USER, user);

        // 根据ID查询商品信息
        Goods goods = goodsService.queryGoodsById(id);

        // 获取当前时间和秒杀时间范围
        long currentTime = System.currentTimeMillis();
        long startTime = goods.getStartTime().getTime();
        long endTime = goods.getEndTime().getTime();

        // 秒杀时间验证逻辑
        if (currentTime < startTime) {
            return HttpResult.builder().code(Constants.ERROR).msg("秒杀未开始").build();
        }
        if (currentTime > endTime) {
            return HttpResult.builder().code(Constants.ERROR).msg("秒杀已结束").build();
        }

        // 秒杀进行中，返回商品随机码
        return HttpResult.builder()
                .code(Constants.SUCCESS)
                .msg("秒杀进行中")
                .data(goods.getRandomName())
                .build();
    }

    /**
     * 查询秒杀结果接口
     * 根据用户ID和商品ID查询秒杀订单状态
     * @param request HTTP请求对象，用于获取登录用户信息
     * @param gid 商品ID路径参数
     * @return 包含订单信息的HttpResult对象
     */
    @GetMapping("/result/{id}")
    @ResponseBody
    public HttpResult queryOrderResult(HttpServletRequest request, @PathVariable("id") Integer gid) {
        // 从session中获取登录用户信息
        Users users = (Users) request.getSession().getAttribute(Constants.LOGIN_USER);

        // 查询秒杀订单结果
        Orders orders = orderService.queryOrderResult(users.getId(), gid);

        if (orders != null) {
            // 秒杀成功，返回订单信息
            return HttpResult.builder().code(Constants.SUCCESS).msg("秒杀成功").data(orders).build();
        }

        // 秒杀进行中或失败，返回相应提示
        return HttpResult.builder().code(Constants.ERROR).msg("秒杀进行中，请稍后查看").data(null).build();
    }
}
